// ajax 封装插件, 使用 axios
// import { createApp } from 'vue'
import axios from 'taro-axios'
import Taro from '@tarojs/taro'
// const api = "/shop";

// const App = createApp()

const config = {
  baseURL: "https://www.58zltc.com", //正式
  // baseURL: "https://cs.58zltc.com", //测试
  timeout: 5 * 1000, // 请求超时时间设置
  crossDomain: true,
  // withCredentials: true, // Check cross-site Access-Control
  // 定义可获得的http响应状态码
  // return true、设置为null或者undefined，promise将resolved,否则将rejected
  validateStatus(status) {
    return status >= 200 && status < 510
  },
}

// const retryTime = 2 // 请求失败重试次数
// const retryDelay = 1500 // 请求失败重试间隔

// 创建请求实例
const _axios = axios.create(config)

_axios.interceptors.request.use((originConfig) => {
  const reqConfig = { ...originConfig }
  // step1: 容错处理
  if (!reqConfig.url) {
    /* eslint-disable-next-line */
    console.error('request need url')
    throw new Error({
      source: 'axiosInterceptors',
      message: 'request need url',
    })
  }
  var token = Taro.getStorageSync('token')
  // console.log(token)
  if (token) {
    reqConfig.data.token = token;
    reqConfig.headers.Token = token;
  } else {
    // reqConfig.data.token = "";
  }

  if (!reqConfig.method) { // 默认使用 get 请求
    reqConfig.method = 'get'
  }
  // 大小写容错
  reqConfig.method = reqConfig.method.toLowerCase()

  // 参数容错
  if (reqConfig.method === 'get') {
    if (!reqConfig.params) { // 防止字段用错
      reqConfig.params = reqConfig.data || {}
    }
  } else if (reqConfig.method === 'post') {
    if (!reqConfig.data) { // 防止字段用错
      reqConfig.data = reqConfig.params || {}
    }
  } else {
    // TODO: 其他类型请求数据格式处理
    /* eslint-disable-next-line */
    console.warn(`其他请求类型: ${reqConfig.method}, 暂无自动处理`)
  }
  return reqConfig
}, (error) => {
  Promise.reject(error)
})

// Add a response interceptor
_axios.interceptors.response.use(async (res) => {
  return new Promise(async (resolve, reject) => {
    const { params } = res.config
    const { code } = res.data
    if (code === 500 || code === 10100) {
      resolve(res.data)
      return
    }
    if (code === 0) {
      // Taro.switchTab({url: "pages/home/home"})
      resolve(res.data)
      return
    }

    // 本次请求添加 params 参数：handleError 为 true，用户自己try catch，框架不做处理
    if (params && params.handleError) {
      reject(res)
      return
    }
    resolve(res.data)
  })
}, (error) => {
  // if (!error.response) {
  //   Toast.fail('网络异常...');
  // }

  // // 判断请求超时
  // if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
  //   Toast.fail('请求超时');
  // }
  return Promise.reject(error)
})


// eslint-disable-next-line
// Plugin.install = function (App, options) {
//   // eslint-disable-next-line
//   App.axios = _axios
//   window.axios = _axios
//   Object.defineProperties(App.prototype, {
//     axios: {
//       get() {
//         return _axios
//       },
//     },
//     $axios: {
//       get() {
//         return _axios
//       },
//     },
//   })
// }

// if (!App.axios) {
//   App.use(Plugin)
// }

// 导出常用函数

/**
 * @param {string} url
 * @param {object} data
 * @param {object} params
 */
export function post(url, data = {}, params = {}) {
  return _axios({
    method: 'post',
    url,
    data,
    params,
  })
}

/**
 * @param {string} url
 * @param {object} params
 */
export function get(url, params = {}) {
  return _axios({
    method: 'get',
    url,
    params,
  })
}

/**
 * @param {string} url
 * @param {object} data
 * @param {object} params
 */
export function put(url, data = {}, params = {}) {
  return _axios({
    method: 'put',
    url,
    params,
    data,
  })
}

/**
 * @param {string} url
 * @param {object} params
 */
export function _delete(url, params = {}) {
  return _axios({
    method: 'delete',
    url,
    params,
  })
}

export default _axios
